home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oh!X 2000 Spring
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin
/
F2JW
/
trans
/
pattern.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-08-22
|
15KB
|
843 lines
//
// フランス語 → 日本語 翻訳プログラム
//
// パターンマッチング部
#include "stdafx.h"
#include <string.h>
#include <ctype.h>
#include "f2j.h"
#include "myprot.h"
extern TOKEN *currentTree;
extern ADVERB dic_adverb_NE;
extern ADVERB dic_adverb_Y;
extern ARTICLE articleTable[];
extern PRONOUN objectNounTable[];
extern PRONOUN nullPronoun;
extern JP_PRONOUN dic_Ce[];
extern BOOL isChanged;
extern JP_PREPOSITION dic_jpPreposition_DE[];
extern PRONOUN nullPronoun;
extern PRONOUN dic_pronoun_en;
extern PREPOSITION dic_preposition_en_de;
//
// FR_PATTERNに合っているか?
//
BOOL
IsPatternMatch(CMP_TOKEN *q, TOKEN *p)
{
while(q->frPart != FR_PART_NONE) {
if(p == NULL) return(FALSE);
if(!IsObjectMatch(p, *q))
return(FALSE);
p = p->next;
q++;
}
return(TRUE);
}
BOOL
IsPatternMatch(FR_PATTERN *q, TOKEN *p)
{
while(q->cmpToken.frPart != FR_PART_NONE) {
if(p == NULL) return(FALSE);
if(!IsObjectMatch(p, q->cmpToken))
return(FALSE);
p = p->next;
q++;
}
return(TRUE);
}
//
// 以下、FR_PATTERN に組込用の評価関数
//
// 常に <TRUE>を返す
BOOL
ReturnTrue(TOKEN *p) {
return(TRUE);
}
// 常に <False>を返す
BOOL
ReturnFalse(TOKEN *p) { return(FALSE); }
//
// 疑問代名詞(副詞)の置き換え
//
void
ChangePattern(TOKEN *start, FR_PATTERN *q, TOKEN *p)
{
int cnt = 0, stack = 0;
int i = 0, j = 0;
TOKEN *tmpTokens[100], *tmp = NULL, *next;
while(q->cmpToken.frPart != FR_PART_NONE) {
if(p == NULL) goto Error;
next = p->next;
if(q->newFrPart) p->frPart = q->newFrPart;
p->jpProp |= q->newJpProp;
if(q->order != 1) DisconnectTOKEN(start, p);
tmpTokens[q->order] = p;
// 変換後、単語数が減る場合も有るので、単純にcnt++してはいけない
if(cnt < q->order) cnt = q->order;
q++;
p = next;
}
tmp = tmpTokens[1]->next;
for(i = 1; i < cnt; i++) {
tmpTokens[i]->next = tmpTokens[i+1];
if(IsObjectMatch(tmpTokens[i], FR_PART_NOUN_GENERAL))
tmpTokens[i]->moved = 1;
}
tmpTokens[cnt]->next = tmp;
return;
Error:
PrintInternalError( "Internal Errorr <ChangeInterrogative> 1\n");
}
//
// FR_PATTERNにて使用される評価関数
//
BOOL
CanBeSubject(TOKEN *p)
{
if(p
// && p->moved == 0 // ProcessInterrogativeで、順序を代えたのは、moved == 1になっている
&& p->frPartChoice != FR_PART_OBJECT
&& (p->frPartParent & FR_PART_VERB)
&& !IsObjectMatch(p, (FR_PART)(FR_PART_NOUN_OBJECT_BOTH | FR_PART_NOUN_RECURSIVE)))
return(TRUE);
return(FALSE);
}
BOOL
CanVerbOrder(TOKEN *p)
{
if(p->subject == NULL
&& (p->frTense & FR_TENSE_ORDER))
return(TRUE);
return(FALSE);
}
BOOL
IsAttribPluralWArticle(TOKEN *p)
{
if((p->frAttrib & FR_ATTRIB_PLURAL)
&& SearchToken(FR_PART_ARTICLE_DEFINIT, p->child)) return(TRUE);
else return(FALSE);
}
BOOL
IsAttribPlural(TOKEN *p)
{
if(p->frAttrib & FR_ATTRIB_PLURAL) return(TRUE);
else return(FALSE);
}
BOOL
IsAttribPlural(TOKEN *s, TOKEN *v)
{
if(s->frAttrib & FR_ATTRIB_PLURAL)
return(TRUE);
return(FALSE);
}
BOOL
HasChildNoun(TOKEN *p)
{
if(p->child
&& SearchToken(FR_PART_NOUN_ALL, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasChildNounTime(TOKEN *p)
{
if(p->child
&& SearchToken(FR_PART_NOUN_GENERAL, JP_PROP_TIME, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasChildAdjective(TOKEN *p)
{
if(SearchToken(FR_PART_ADJECTIVE_ALL, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasNoArticlePossesive(TOKEN *p)
{
if(p->child
&& (SearchToken(FR_PART_ARTICLE_ALL, p->child)
|| SearchToken(FR_PART_ADJECTIVE_POSSESIVE, p->child)))
return(FALSE);
return(TRUE);
}
BOOL
HasNoArticleWMO(TOKEN *p)
{
if(p->child == NULL) return(FALSE);
TOKEN *noun = SearchToken(FR_PART_NOUN_ALL, p->child);
if(noun == NULL) return(FALSE);
if(noun->child
&& SearchToken(FR_PART_ARTICLE_ALL, noun->child))
return(FALSE);
if(!(p->jpEmphasis & JP_EMPHASIS_MO))
return(FALSE);
return(TRUE);
}
BOOL
HasPluralArticlePossesive(TOKEN *p)
{
if((p->frAttrib & FR_ATTRIB_PLURAL)
&& p->child
&& (SearchToken(FR_PART_ARTICLE_ALL, p->child)
|| SearchToken(FR_PART_ADJECTIVE_POSSESIVE, p->child)))
return(TRUE);
return(FALSE);
}
BOOL
HasNoValue2(TOKEN *p)
{
if(p->value2 == 0)
return(TRUE);
return(FALSE);
}
BOOL
IsTokenSingle(TOKEN *p)
{
if(p->frAttrib & FR_ATTRIB_SINGLE)
return(TRUE);
else
return(FALSE);
}
BOOL
IsTokenPlural(TOKEN *p)
{
if(p->frAttrib & FR_ATTRIB_PLURAL)
return(TRUE);
else
return(FALSE);
}
BOOL
IsSentenceSVA(TOKEN *p)
{
JP_VERB *jpVerb;
if((p->frPart & FR_PART_VERB)
&& p->which) {
jpVerb = (JP_VERB *)p->which;
}
if(IsObjectMatch(p, FR_PART_SENTENCE_ALL)
&& p->object2
&& (p->object2->frPart & FR_PART_VERB)
&& p->object2->which) {
jpVerb = (JP_VERB *)p->object2->which;
}
if( jpVerb
&& (jpVerb->jpHint & JP_HINT_SVA))
return(TRUE);
return (FALSE);
}
//
// 主語は、人称代名詞でない"ce"か?
//
BOOL
IsSubjectPersonalCe(TOKEN *p)
{
if((p->frPart & FR_PART_VERB)
&& p->subject
&& IsObjectMatch(p->subject, FR_PART_NOUN_SUBJECT, JP_PROP_NONE, NULL, "ce")
&& p->which) {
JP_VERB *jpVerb = (JP_VERB *)p->which;
// 既に仮主語として使われている
if(jpVerb->frPart0 != FR_PART_NOUN_IMPERSONAL)
return(TRUE);
}
return (FALSE);
}
BOOL
IsTokenRootWChild(TOKEN *p)
{
if(p->child && IsTokenRoot(p))
return(TRUE);
else
return(FALSE);
}
BOOL
IsTokenRoot(TOKEN *p)
{
if(p->jpEmphasis & JP_EMPHASIS_ROOT)
return(TRUE);
else
return(FALSE);
}
BOOL
IsSubjectPersonalCe_End(TOKEN *p)
{
if(IsSubjectPersonalCe(p)
&& p->next == NULL)
return(TRUE);
else
return(FALSE);
}
BOOL
IsQuestion(TOKEN *p)
{
if(currentTree->punctuation == FR_PUNCT_QUESTION)
return(TRUE);
else
return(FALSE);
}
BOOL
IsQuestionLast(TOKEN *p)
{
if(p->next == NULL
&& currentTree->punctuation == FR_PUNCT_QUESTION)
return(TRUE);
else
return(FALSE);
}
BOOL
IsExclaminationLast(TOKEN *p)
{
if(p->next == NULL
&& currentTree->punctuation == FR_PUNCT_EXCLAMINATION) {
if(p->object2 && IsObjectMatch(p, FR_PART_SENTENCE_ALL))
p = p->object2; // SENTENCEのVERB
// 接続法を用いた3人称命令形をはじく eg) Qu'il parte imm{diatement!
if((p->frPart & FR_PART_VERB)
&& (p->frAttrib & FR_ATTRIB_LEVEL3)
&& (p->frTense & FR_TENSE_SUBJUNCTIVE)) return(FALSE);
return(TRUE);
} else
return(FALSE);
}
BOOL
HasExclaminationAdjective(TOKEN *p)
{
if(SearchToken(FR_PART_ADJECTIVE_EXCLAMINATION, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasArticleDefinit(TOKEN *p)
{
if(SearchToken(FR_PART_ARTICLE_DEFINIT, p->child))
return(TRUE);
return(FALSE);
}
// 曜日は固有名詞にして、冠詞なしでも通してしまおう。
// eg) je pars lundi prochain.
BOOL
HasArticleDefinitOrUnique(TOKEN *p)
{
if(SearchToken(FR_PART_ARTICLE_DEFINIT, p->child)
|| SearchToken(FR_PART_NUMETRIC_NUMBER, p->child)
|| SearchToken(FR_PART_ADJECTIVE_DEMONSTRATIVE, p->child)
|| SearchToken(FR_PART_ADJECTIVE_POSSESIVE, p->child)
|| p->jpProp & JP_PROP_UNIQUE)
return(TRUE);
else
return(FALSE);
}
BOOL
HasArticleDefinitOrUnique_End(TOKEN *p)
{
if(HasArticleDefinitOrUnique(p)
&& p->next == NULL) return(TRUE);
else return(FALSE);
}
BOOL
HasArticleOrUnique(TOKEN *p)
{
if(SearchToken(FR_PART_ARTICLE_ALL, p->child)
|| SearchToken(FR_PART_ADJECTIVE_DEMONSTRATIVE, p->child)
|| SearchToken(FR_PART_ADJECTIVE_POSSESIVE, p->child)
|| p->jpProp & JP_PROP_UNIQUE)
return(TRUE);
else
return(FALSE);
}
BOOL
HasAdjective(TOKEN *p)
{
if(SearchToken(FR_PART_ADJECTIVE_ALL, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasVerbVerbObject(TOKEN *p)
{
if(p->frPart & FR_PART_VERB) {
if(p->object1) {
if((p->object1->frPart & FR_PART_VERB)
|| SearchToken(FR_PART_RELATIVE_ALL, p->object1->child))
return(TRUE);
}
if(p->object2) {
if((p->object2->frPart & FR_PART_VERB)
|| SearchToken(FR_PART_RELATIVE_ALL, p->object2->child))
return(TRUE);
}
}
return(FALSE);
}
BOOL
HasObject1(TOKEN *p)
{
if(p->object1)
return(TRUE);
return(FALSE);
}
BOOL
HasNoObjects(TOKEN *p)
{
if(p->object1 == NULL
&& p->object2 == NULL)
return(TRUE);
return(FALSE);
}
BOOL
HasNumber(TOKEN *p)
{
if(SearchToken(FR_PART_NUMETRIC_NUMBER, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasOnlyObject2(TOKEN *p)
{
if(p->object1 == NULL
&& p->object2 != NULL)
return(TRUE);
return(FALSE);
}
BOOL
HasPastParticile(TOKEN *p)
{
if(SearchToken(FR_PART_VERB_P_PAST, p->child))
return(TRUE);
else
return(FALSE);
}
BOOL
HasPrepositionDe(TOKEN *p)
{
if(SearchToken(FR_PART_PREPOSIT_DE, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasPrepositionDeInf(TOKEN *p)
{
if(SearchToken(FR_PART_PREPOSIT_DE_INF, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasRelative(TOKEN *p)
{
if(p->frPart & FR_PART_RELATIVE) return(TRUE);
if(p->subject && HasRelative(p->subject)) return(TRUE);
if(p->object1 && HasRelative(p->object1)) return(TRUE);
if(p->object2 && HasRelative(p->object2)) return(TRUE);
for(TOKEN *q = p->child; q; q = q->next) {
if(HasRelative(q)) return(TRUE);
}
return(FALSE);
}
BOOL
HasQue(TOKEN *p)
{
if(p
&& SearchToken(FR_PART_RELATIVE_OBJECT, p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasQuel(TOKEN *p)
{
if(p
&& SearchToken("quel", p->child))
return(TRUE);
return(FALSE);
}
BOOL
HasQui(TOKEN *p)
{
if(p
&& SearchToken(FR_PART_RELATIVE_SUBJECT, p->child))
return(TRUE);
return(FALSE);
}
// JP_KIND == JP_KIND_NO ?
BOOL
IsJpKind_NO(TOKEN *p)
{
if(p->which
&& GetJpKind(p) == JP_KIND_NONE)
return(TRUE);
return(FALSE);
}
// JP_KIND == JP_KIND_KAMIICHI ?
BOOL
IsJpKind_KAMIICHI(TOKEN *p)
{
if(p->which
&& GetJpKind(p) == JP_KIND_IRU)
return(TRUE);
return(FALSE);
}
BOOL
IsTenseFuture(TOKEN *p)
{
if(p->frTense & FR_TENSE_FUTURE_SIMPLE)
return(TRUE);
return(FALSE);
}
BOOL
IsTenseOrigin(TOKEN *p)
{
if(p->frTense & FR_TENSE_ORIGIN) return(TRUE);
else return(FALSE);
}
BOOL
IsNotParticiple(TOKEN *p)
{
if(!(p->frPart & FR_PART_VERB)
|| (p->frTense & FR_TENSE_P_PRESENT)
|| (p->frTense & FR_TENSE_P_PAST))
return(FALSE);
return(TRUE);
}
BOOL
IsNotThing(TOKEN *p)
{
if(!(p->jpProp & JP_PROP_THING))
return(TRUE);
return(FALSE);
}
BOOL
IsSubjunctive(TOKEN *p)
{
if(p &&IsObjectMatch(p, FR_PART_SENTENCE_ALL))
p = p->object2;
if( p
&& (p->frPart & FR_PART_VERB)
&& (p->frTense & FR_TENSE_SUBJUNCTIVE))
return(TRUE);
return(FALSE);
}
BOOL
IsNotTokenCombine(TOKEN *p)
{
if(p->frPart & FR_PART_COMBINE)
return(FALSE);
else
return(TRUE);
}
BOOL
IsAttribPlus(TOKEN *p)
{
if(p->frAttrib & FR_ATTRIB_PLUS)
return(TRUE);
else
return(FALSE);
}
BOOL
IsAttribMoins(TOKEN *p)
{
if(p->frAttrib & FR_ATTRIB_MOINS)
return(TRUE);
return(FALSE);
}
BOOL
IsAttribIl(TOKEN *p)
{
if((p->frAttrib & FR_ATTRIB_SINGLE)
&& (p->frAttrib & FR_ATTRIB_MALE)
&& (p->frAttrib & FR_ATTRIB_LEVEL3))
return(TRUE);
else
return(FALSE);
}
BOOL
IsCompare(TOKEN *p)
{
if(p->frAttrib & FR_ATTRIB_COMPARE)
return(TRUE);
return(FALSE);
}
// 曜日の名前か?
char *daynameTable[] = {
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi",
"dimanche",
"" // End Code
};
BOOL
IsDayName(TOKEN *p)
{
for(int i = 0; daynameTable[i][0]; i++) {
if(IsTokenFrench(p, daynameTable[i]))
return(TRUE);
}
return(FALSE);
}
BOOL
IsNotPassive(TOKEN *p)
{
if(IsObjectMatch(p, FR_PART_SENTENCE_ALL)
&& p->object2
&& (p->object2->frPart & FR_PART_VERB))
p = p->object2;
if(!(p->frTense & FR_TENSE_PASSIVE))
return(TRUE);
return(FALSE);
}
BOOL
IsNullNoun(TOKEN *p)
{
if(p->what == (void *)&nullPronoun)
return(TRUE);
return(FALSE);
}
BOOL
IsMoved(TOKEN *p)
{
if(p->moved)
return(TRUE);
return(FALSE);
}
BOOL
IsVerbOrigin(TOKEN *p)
{
if((p->frPart & FR_PART_VERB)
&& (p->frTense & FR_TENSE_ORIGIN))
return(TRUE);
return(FALSE);
}
BOOL
IsWhichFixed(TOKEN *p)
{
if(p->which) return(TRUE);
return(FALSE);
}
BOOL
CanNounParent(TOKEN *p)
{
if(p->frPartParent & FR_PART_NOUN)
return(TRUE);
return(FALSE);
}
BOOL
CanVerbParent(TOKEN *p)
{
if(p->frPartParent & FR_PART_VERB)
return(TRUE);
return(FALSE);
}
void
ReplaceObject1(TOKEN *verb)
{
TOKEN *object = verb->object1;
if(object == NULL) return;
if((object->frPart & FR_PART_PREPOSIT)
&& object->object1) {
object = object->object1;
}
object->prtControl = PRT_CONTROL_REPLACED;
DisablePrtControl(object->child, FR_PART_ARTICLE_ALL);
}
void
ReplaceObject1(TOKEN *parent, TOKEN *p)
{
ReplaceObject1(p);
}
void
ReplaceObject1De(TOKEN *verb)
{
if(verb
&& verb->object1) {
verb->object1->prtControl = PRT_CONTROL_REPLACED;
TOKEN *de = SearchToken(FR_PART_PREPOSIT_DE, verb->object1->child);
if(de) de->prtControl = PRT_CONTROL_REPLACED;
}
}
void
EmphasisChildSubject_GA(TOKEN *parent, TOKEN *child)
{
if((child->frPart & FR_PART_PREPOSIT)
&& child->object1) {
EmphasisChildSubject_GA(parent, child->object1);
}
else if((child->frPart & FR_PART_VERB)
&& child->subject) {
child->subject->jpEmphasis |= JP_EMPHASIS_GA;
}
else {
child->jpEmphasis |= JP_EMPHASIS_GA;
}
}
void
DemphasisParentSubject_GA(TOKEN *parent, TOKEN *child)
{
if(parent->frPart & FR_PART_PREPOSIT
&& parent->object1) {
DemphasisParentSubject_GA(parent->object1, child);
} else if((parent->frPart & FR_PART_VERB)
&& parent->subject) {
parent->subject->jpEmphasis -= JP_EMPHASIS_GA;
}
else {
parent->jpEmphasis -= JP_EMPHASIS_GA;
}
}
void
DemphasisChildSubject_GA(TOKEN *parent, TOKEN *child)
{
if((child->frPart & FR_PART_PREPOSIT)
&& child->object1) {
DemphasisChildSubject_GA(parent, child->object1);
} else if((child->frPart & FR_PART_VERB)
&& child->subject) {
child->subject->jpEmphasis -= JP_EMPHASIS_GA;
}
else {
child->jpEmphasis -= JP_EMPHASIS_GA;
}
}
void
DisableChildPrtControl(TOKEN *parent, TOKEN *child)
{
if(child)
child->prtControl = PRT_CONTROL_DISABLE;
}